/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package entityprojet;

import entityprojet.exceptions.NonexistentEntityException;
import entityprojet.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

/**
 *
 * @author Ron
 */
public class FRessourceprodJpaController implements Serializable {

    public FRessourceprodJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public FRessourceprodJpaController() {
        this.emf = Persistence.createEntityManagerFactory("projetT_RPU");
    }
    
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(FRessourceprod FRessourceprod) throws PreexistingEntityException, Exception {
        if (FRessourceprod.getFArticleCollection() == null) {
            FRessourceprod.setFArticleCollection(new ArrayList<FArticle>());
        }
        if (FRessourceprod.getFDocligneCollection() == null) {
            FRessourceprod.setFDocligneCollection(new ArrayList<FDocligne>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FArticle ARRefDefaut = FRessourceprod.getARRefDefaut();
            if (ARRefDefaut != null) {
                ARRefDefaut = em.getReference(ARRefDefaut.getClass(), ARRefDefaut.getCbMarq());
                FRessourceprod.setARRefDefaut(ARRefDefaut);
            }
            FCalendrier CALNo = FRessourceprod.getCALNo();
            if (CALNo != null) {
                CALNo = em.getReference(CALNo.getClass(), CALNo.getCbMarq());
                FRessourceprod.setCALNo(CALNo);
            }
            FDepot DENo = FRessourceprod.getDENo();
            if (DENo != null) {
                DENo = em.getReference(DENo.getClass(), DENo.getCbMarq());
                FRessourceprod.setDENo(DENo);
            }
            Collection<FArticle> attachedFArticleCollection = new ArrayList<FArticle>();
            for (FArticle FArticleCollectionFArticleToAttach : FRessourceprod.getFArticleCollection()) {
                FArticleCollectionFArticleToAttach = em.getReference(FArticleCollectionFArticleToAttach.getClass(), FArticleCollectionFArticleToAttach.getCbMarq());
                attachedFArticleCollection.add(FArticleCollectionFArticleToAttach);
            }
            FRessourceprod.setFArticleCollection(attachedFArticleCollection);
            Collection<FDocligne> attachedFDocligneCollection = new ArrayList<FDocligne>();
            for (FDocligne FDocligneCollectionFDocligneToAttach : FRessourceprod.getFDocligneCollection()) {
                FDocligneCollectionFDocligneToAttach = em.getReference(FDocligneCollectionFDocligneToAttach.getClass(), FDocligneCollectionFDocligneToAttach.getCbMarq());
                attachedFDocligneCollection.add(FDocligneCollectionFDocligneToAttach);
            }
            FRessourceprod.setFDocligneCollection(attachedFDocligneCollection);
            em.persist(FRessourceprod);
            if (ARRefDefaut != null) {
                FRessourceprod oldRPCodeDefautOfARRefDefaut = ARRefDefaut.getRPCodeDefaut();
                if (oldRPCodeDefautOfARRefDefaut != null) {
                    oldRPCodeDefautOfARRefDefaut.setARRefDefaut(null);
                    oldRPCodeDefautOfARRefDefaut = em.merge(oldRPCodeDefautOfARRefDefaut);
                }
                ARRefDefaut.setRPCodeDefaut(FRessourceprod);
                ARRefDefaut = em.merge(ARRefDefaut);
            }
            if (CALNo != null) {
                CALNo.getFRessourceprodCollection().add(FRessourceprod);
                CALNo = em.merge(CALNo);
            }
            if (DENo != null) {
                DENo.getFRessourceprodCollection().add(FRessourceprod);
                DENo = em.merge(DENo);
            }
            for (FArticle FArticleCollectionFArticle : FRessourceprod.getFArticleCollection()) {
                FRessourceprod oldRPCodeDefautOfFArticleCollectionFArticle = FArticleCollectionFArticle.getRPCodeDefaut();
                FArticleCollectionFArticle.setRPCodeDefaut(FRessourceprod);
                FArticleCollectionFArticle = em.merge(FArticleCollectionFArticle);
                if (oldRPCodeDefautOfFArticleCollectionFArticle != null) {
                    oldRPCodeDefautOfFArticleCollectionFArticle.getFArticleCollection().remove(FArticleCollectionFArticle);
                    oldRPCodeDefautOfFArticleCollectionFArticle = em.merge(oldRPCodeDefautOfFArticleCollectionFArticle);
                }
            }
            for (FDocligne FDocligneCollectionFDocligne : FRessourceprod.getFDocligneCollection()) {
                FRessourceprod oldRPCodeOfFDocligneCollectionFDocligne = FDocligneCollectionFDocligne.getRPCode();
                FDocligneCollectionFDocligne.setRPCode(FRessourceprod);
                FDocligneCollectionFDocligne = em.merge(FDocligneCollectionFDocligne);
                if (oldRPCodeOfFDocligneCollectionFDocligne != null) {
                    oldRPCodeOfFDocligneCollectionFDocligne.getFDocligneCollection().remove(FDocligneCollectionFDocligne);
                    oldRPCodeOfFDocligneCollectionFDocligne = em.merge(oldRPCodeOfFDocligneCollectionFDocligne);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findFRessourceprod(FRessourceprod.getCbMarq()) != null) {
                throw new PreexistingEntityException("FRessourceprod " + FRessourceprod + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(FRessourceprod FRessourceprod) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FRessourceprod persistentFRessourceprod = em.find(FRessourceprod.class, FRessourceprod.getCbMarq());
            FArticle ARRefDefautOld = persistentFRessourceprod.getARRefDefaut();
            FArticle ARRefDefautNew = FRessourceprod.getARRefDefaut();
            FCalendrier CALNoOld = persistentFRessourceprod.getCALNo();
            FCalendrier CALNoNew = FRessourceprod.getCALNo();
            FDepot DENoOld = persistentFRessourceprod.getDENo();
            FDepot DENoNew = FRessourceprod.getDENo();
            Collection<FArticle> FArticleCollectionOld = persistentFRessourceprod.getFArticleCollection();
            Collection<FArticle> FArticleCollectionNew = FRessourceprod.getFArticleCollection();
            Collection<FDocligne> FDocligneCollectionOld = persistentFRessourceprod.getFDocligneCollection();
            Collection<FDocligne> FDocligneCollectionNew = FRessourceprod.getFDocligneCollection();
            if (ARRefDefautNew != null) {
                ARRefDefautNew = em.getReference(ARRefDefautNew.getClass(), ARRefDefautNew.getCbMarq());
                FRessourceprod.setARRefDefaut(ARRefDefautNew);
            }
            if (CALNoNew != null) {
                CALNoNew = em.getReference(CALNoNew.getClass(), CALNoNew.getCbMarq());
                FRessourceprod.setCALNo(CALNoNew);
            }
            if (DENoNew != null) {
                DENoNew = em.getReference(DENoNew.getClass(), DENoNew.getCbMarq());
                FRessourceprod.setDENo(DENoNew);
            }
            Collection<FArticle> attachedFArticleCollectionNew = new ArrayList<FArticle>();
            for (FArticle FArticleCollectionNewFArticleToAttach : FArticleCollectionNew) {
                FArticleCollectionNewFArticleToAttach = em.getReference(FArticleCollectionNewFArticleToAttach.getClass(), FArticleCollectionNewFArticleToAttach.getCbMarq());
                attachedFArticleCollectionNew.add(FArticleCollectionNewFArticleToAttach);
            }
            FArticleCollectionNew = attachedFArticleCollectionNew;
            FRessourceprod.setFArticleCollection(FArticleCollectionNew);
            Collection<FDocligne> attachedFDocligneCollectionNew = new ArrayList<FDocligne>();
            for (FDocligne FDocligneCollectionNewFDocligneToAttach : FDocligneCollectionNew) {
                FDocligneCollectionNewFDocligneToAttach = em.getReference(FDocligneCollectionNewFDocligneToAttach.getClass(), FDocligneCollectionNewFDocligneToAttach.getCbMarq());
                attachedFDocligneCollectionNew.add(FDocligneCollectionNewFDocligneToAttach);
            }
            FDocligneCollectionNew = attachedFDocligneCollectionNew;
            FRessourceprod.setFDocligneCollection(FDocligneCollectionNew);
            FRessourceprod = em.merge(FRessourceprod);
            if (ARRefDefautOld != null && !ARRefDefautOld.equals(ARRefDefautNew)) {
                ARRefDefautOld.setRPCodeDefaut(null);
                ARRefDefautOld = em.merge(ARRefDefautOld);
            }
            if (ARRefDefautNew != null && !ARRefDefautNew.equals(ARRefDefautOld)) {
                FRessourceprod oldRPCodeDefautOfARRefDefaut = ARRefDefautNew.getRPCodeDefaut();
                if (oldRPCodeDefautOfARRefDefaut != null) {
                    oldRPCodeDefautOfARRefDefaut.setARRefDefaut(null);
                    oldRPCodeDefautOfARRefDefaut = em.merge(oldRPCodeDefautOfARRefDefaut);
                }
                ARRefDefautNew.setRPCodeDefaut(FRessourceprod);
                ARRefDefautNew = em.merge(ARRefDefautNew);
            }
            if (CALNoOld != null && !CALNoOld.equals(CALNoNew)) {
                CALNoOld.getFRessourceprodCollection().remove(FRessourceprod);
                CALNoOld = em.merge(CALNoOld);
            }
            if (CALNoNew != null && !CALNoNew.equals(CALNoOld)) {
                CALNoNew.getFRessourceprodCollection().add(FRessourceprod);
                CALNoNew = em.merge(CALNoNew);
            }
            if (DENoOld != null && !DENoOld.equals(DENoNew)) {
                DENoOld.getFRessourceprodCollection().remove(FRessourceprod);
                DENoOld = em.merge(DENoOld);
            }
            if (DENoNew != null && !DENoNew.equals(DENoOld)) {
                DENoNew.getFRessourceprodCollection().add(FRessourceprod);
                DENoNew = em.merge(DENoNew);
            }
            for (FArticle FArticleCollectionOldFArticle : FArticleCollectionOld) {
                if (!FArticleCollectionNew.contains(FArticleCollectionOldFArticle)) {
                    FArticleCollectionOldFArticle.setRPCodeDefaut(null);
                    FArticleCollectionOldFArticle = em.merge(FArticleCollectionOldFArticle);
                }
            }
            for (FArticle FArticleCollectionNewFArticle : FArticleCollectionNew) {
                if (!FArticleCollectionOld.contains(FArticleCollectionNewFArticle)) {
                    FRessourceprod oldRPCodeDefautOfFArticleCollectionNewFArticle = FArticleCollectionNewFArticle.getRPCodeDefaut();
                    FArticleCollectionNewFArticle.setRPCodeDefaut(FRessourceprod);
                    FArticleCollectionNewFArticle = em.merge(FArticleCollectionNewFArticle);
                    if (oldRPCodeDefautOfFArticleCollectionNewFArticle != null && !oldRPCodeDefautOfFArticleCollectionNewFArticle.equals(FRessourceprod)) {
                        oldRPCodeDefautOfFArticleCollectionNewFArticle.getFArticleCollection().remove(FArticleCollectionNewFArticle);
                        oldRPCodeDefautOfFArticleCollectionNewFArticle = em.merge(oldRPCodeDefautOfFArticleCollectionNewFArticle);
                    }
                }
            }
            for (FDocligne FDocligneCollectionOldFDocligne : FDocligneCollectionOld) {
                if (!FDocligneCollectionNew.contains(FDocligneCollectionOldFDocligne)) {
                    FDocligneCollectionOldFDocligne.setRPCode(null);
                    FDocligneCollectionOldFDocligne = em.merge(FDocligneCollectionOldFDocligne);
                }
            }
            for (FDocligne FDocligneCollectionNewFDocligne : FDocligneCollectionNew) {
                if (!FDocligneCollectionOld.contains(FDocligneCollectionNewFDocligne)) {
                    FRessourceprod oldRPCodeOfFDocligneCollectionNewFDocligne = FDocligneCollectionNewFDocligne.getRPCode();
                    FDocligneCollectionNewFDocligne.setRPCode(FRessourceprod);
                    FDocligneCollectionNewFDocligne = em.merge(FDocligneCollectionNewFDocligne);
                    if (oldRPCodeOfFDocligneCollectionNewFDocligne != null && !oldRPCodeOfFDocligneCollectionNewFDocligne.equals(FRessourceprod)) {
                        oldRPCodeOfFDocligneCollectionNewFDocligne.getFDocligneCollection().remove(FDocligneCollectionNewFDocligne);
                        oldRPCodeOfFDocligneCollectionNewFDocligne = em.merge(oldRPCodeOfFDocligneCollectionNewFDocligne);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = FRessourceprod.getCbMarq();
                if (findFRessourceprod(id) == null) {
                    throw new NonexistentEntityException("The fRessourceprod with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FRessourceprod FRessourceprod;
            try {
                FRessourceprod = em.getReference(FRessourceprod.class, id);
                FRessourceprod.getCbMarq();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The FRessourceprod with id " + id + " no longer exists.", enfe);
            }
            FArticle ARRefDefaut = FRessourceprod.getARRefDefaut();
            if (ARRefDefaut != null) {
                ARRefDefaut.setRPCodeDefaut(null);
                ARRefDefaut = em.merge(ARRefDefaut);
            }
            FCalendrier CALNo = FRessourceprod.getCALNo();
            if (CALNo != null) {
                CALNo.getFRessourceprodCollection().remove(FRessourceprod);
                CALNo = em.merge(CALNo);
            }
            FDepot DENo = FRessourceprod.getDENo();
            if (DENo != null) {
                DENo.getFRessourceprodCollection().remove(FRessourceprod);
                DENo = em.merge(DENo);
            }
            Collection<FArticle> FArticleCollection = FRessourceprod.getFArticleCollection();
            for (FArticle FArticleCollectionFArticle : FArticleCollection) {
                FArticleCollectionFArticle.setRPCodeDefaut(null);
                FArticleCollectionFArticle = em.merge(FArticleCollectionFArticle);
            }
            Collection<FDocligne> FDocligneCollection = FRessourceprod.getFDocligneCollection();
            for (FDocligne FDocligneCollectionFDocligne : FDocligneCollection) {
                FDocligneCollectionFDocligne.setRPCode(null);
                FDocligneCollectionFDocligne = em.merge(FDocligneCollectionFDocligne);
            }
            em.remove(FRessourceprod);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<FRessourceprod> findFRessourceprodEntities() {
        return findFRessourceprodEntities(true, -1, -1);
    }

    public List<FRessourceprod> findFRessourceprodEntities(int maxResults, int firstResult) {
        return findFRessourceprodEntities(false, maxResults, firstResult);
    }

    private List<FRessourceprod> findFRessourceprodEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(FRessourceprod.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public FRessourceprod findFRessourceprod(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(FRessourceprod.class, id);
        } finally {
            em.close();
        }
    }

    public int getFRessourceprodCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<FRessourceprod> rt = cq.from(FRessourceprod.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
